php artisan make:controller ProductController
class ProductController extends Controller
{
// index 要處理的邏輯
// ...
}
# 到 routes\web.php 內設定路由
# 目前沒有特別綁定 Class , 先用一般引入 Controller Class
use App\Http\Controllers\ProductController;
# 使用 tuple 語法指定 Controller
Route::get('/product', [ProductController::class, 'index']);
class ProductController extends Controller
{
public function index()
{
# 建立模板變數 title
$binding['title'] = 'ProductController@index';
# 回傳 html, 使用 resources\views\product\list.blade.php 模板
# 第二個參數將要使用的變數給模板($binding)
return view('product.list', $binding);
}
}
# routes\web.php 建立 /product/create 路由(GET、POST)產生表單頁面與接收表單訊息
# 建立 product 群組路由
Route::group(['prefix' => 'product'], function(){
Route::get('/', [ProductController::class, 'index']);
Route::get('/create', [ProductController::class, 'create']);
# 設定路由名稱方便表單使用
Route::post(
'/create',
[ProductController::class, 'store']
)->name('product.createProcess');
});
class ProductController extends Controller
{
// ... 其他程式省略
public function create()
{
$binding['title'] = 'GET -> ProductController@create';
# blade from action 設定為
return view('product.create', $binding);
}
}
create product 表單頁面
建立 store() 方法接收使用者輸入參數, 接受方法有三種
a. 使用全域輔助函數 request()
class ProductController extends Controller
{
// ... 其他程式省略
public function store(){
$request = request()->all();
echo "<pre>";
print_r($request);
exit;
}
}
b. 使用靜態介面
# Controller 內引用 Request
use Request;
class ProductController extends Controller
{
// ... 其他程式省略
# 使用 only 只取使用者輸入的欄位值
public function store(){
// $request = request()->all();
$request = Request::only(['name', 'simpleintro']);
echo "<pre>";
print_r($request);
exit;
}
}
c. 使用依賴項目注入(typehint 方法簽章)
* typehint 告知 PHP 此參數必須是要傳入所指定的類型
# 引入 Illuminate\Http\Request
use Illuminate\Http\Request;
class ProductController extends Controller
{
// ... 其他程式省略
public function store(Request $request){
// $request = request()->all();
// $request = Request::only(['name', 'simpleintro']);
$input = $request->only(['name', 'simpleintro']);
echo "<pre>";
print_r($input);
exit;
}
}
資源控制器 ( REST/CRUD controller )
php artisan make:controller ArticleController --resource
# 設定路由綁定資源
# route\web.php
# 第一個參數為路由名稱後面會接相關方法
# e.g. article.index
Route::resource('article', 'App\Http\Controllers\ArticleController');
php artisan route:list
# 使用 only 只用指定的路由
Route::resource(
'article',
'App\Http\Controllers\ArticleController',
[ 'only' => ['index', 'show'] ]
);
# 使用 except 不用排除指定的路由
Route::resource(
'article',
'App\Http\Controllers\ArticleController',
[ 'except' => ['index', 'show'] ]
);
API 資源控制器
php artisan make:controller ArticleApiController --api
# 設定位置 route\api.php
Route::apiResource('article', 'App\Http\Controllers\ArticleApiController');
# 建立一個 singleController 只負責處理一個路由
class singleController extends Controller
{
public function __invoke(Product product)
{
// Controller 要做的事情
}
}
# routes\web.php 設定路由
Route::post('product/{product}/update_roduct', 'singleController');
設定時給一個路由參數用來指定路由使用哪個 Class 解析, 預設會將傳進來的當成 id (唯一值) 進到資料庫查詢該筆資料, 回傳資料的 model 物件
a. 隱性綁定
# 路由一般使用方式, 得到該筆資料
Route::get('product/{id}', function($id){
$product = Product::findOrFail($id);
});
# 隱性綁定 + typehint
# Laravel 5.2 以後添加此功能
Route::get('product/{product}', function( Product $product ){
return view('product.view')->with('product', $product);
});
# 要改變綁定的資料庫欄位, 要在 model 設定 getRouteKeyName() 方法
# 設定 serial_number 為綁定的欄位
public function getRouteKeyName(){
return 'serial_number';
}
b. 自訂路由 model 綁定
public function boot(){
# 當路由中有設定 {product} 變數時會轉成 model Product 物件
Route::model('product', Product::class);
}